home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #1
/
Amiga Plus CD - 1997 - No. 01.iso
/
pd
/
programmierung
/
proasm
/
routines
/
paraliner.r
< prev
next >
Wrap
Text File
|
1993-10-15
|
6KB
|
311 lines
;---; paraliner.r ;----------------------------------------------------------
*
* **** UNIX like parameter line parser ****
*
* Author Daniel Weber
* Version 1.06
* Last Revision 26.06.93
* Identifier prl_defined
* Prefix prl_ (parameter line)
* ¯ ¯ ¯
* Functions Paraliner parameter line parser
*
* prl_spacekiller simple space killer
* prl_nametaker reads the file name to a dest. buffer
* prl_nametakerxx line prl_nametaker but case independant
* and accepting " " as possible end char
*
*
* Activation prl_<char>: EQU <handler routine>
* prl_file EQU <file name reader routine>
* (NOTE: <char>: A..Z UPPER CASE!!!)
*
* f.e: prl_A EQU my_A_Handler
*
* Notes Note that these activation flags must be defined before
* you include this routine else the default handler
* will be used ('errline')!
*
* The option handlers must exit using a RTS instruction
* and the registers A0/A4 must be kept unaffected
* (except A0 for the file name taker)!
*
* You may use a5 as your 'external' base, since a4
* will not be affected.
*
* Return values Handler routines: d0: +: OK for a non multi
* parameter
* (f.e.: -o <file> -d)
* 0: OK for a multi parameter
* (f.e.: -bdc = -b -d -c)
* -: FAILED
*
* Name reader routines: d0: 0+: OK -:FAILED
*
;------------------------------------------------------------------------------
;------------------
ifnd prl_defined
prl_defined SET 1
;------------------
prl_oldbase equ __BASE
base prl_base
prl_base:
;------------------
opt sto,o+,q+,ow- ;all optimisations on
;------------------------------------------------------------------------------
prl_option MACRO ;macro to create the parameter line
IFEQ NARG
FAIL paraliner.r: option missing
ELSE
IFD prl_\1
dc.w prl_\1%
ELSE
dc.w .unknparameter%
ENDC
ENDC
ENDM
;------------------------------------------------------------------------------
*
* Paraliner - UNIX like parameter line parser
*
* INPUT: d0: command line length (prl_cmdlen)
* a0: command line (prl_cmdline)
*
* RESULT: D0: 0: valid -: Usage/invalid (see prl_invalid)
* prl_invalid: 0: ok -: invalid
*
* (Usage: D0<>0 and prl_inavlid=0)
*
;------------------------------------------------------------------------------
Paraliner:
;------------------
movem.l d1-d7/a1-a6,-(a7)
; move.l prl_cmdlen(pc),d0
; move.l prl_cmdline(pc),a0
lea prl_base(pc),a4
clr.b -1(a0,d0.l) ;last char now zero
moveq #2,d1
cmp.l d1,d0
bcs prl_usage
clr.b prl_invalid(a4)
;----------------------------
.options:
tst.b prl_invalid(a4) ;error occured during parameter processing
bne .errline
bsr prl_spacekiller ;higher word cleared in spacekiller
move.b (a0)+,d0
beq .goodline
; move.b d0,d1
; lsl.w #8,d1
; move.b (a0),d1
; cmp.w #"?"<<8,d1
; beq .usage
; cmp.w #"? ",d1
; beq .usage
cmp.b #"-",d0
bne .name
move.b (a0)+,d0
beq .errline
.takenext:
and.b #$df,d0
sub.b #"A",d0
cmp.b #"Z"-"A",d0
bhi .errline
add.w d0,d0
move.w .paras(pc,d0.w),d0
jsr (a4,d0.w)
tst.l d0
bmi .errline
bne.s .options
.nobinfile: ;after allowed options only!!
moveq #0,d0 ;for multiply options (-bd)
move.b (a0)+,d0
beq .goodline
cmp.b #" ",d0
beq .options
bra .takenext
;-----------------------
.paras: prl_option A
prl_option B
prl_option C
prl_option D
prl_option E
prl_option F
prl_option G
prl_option H
prl_option I
prl_option J
prl_option K
prl_option L
prl_option M
prl_option N
prl_option O
prl_option P
prl_option Q
prl_option R
prl_option S
prl_option T
prl_option U
prl_option V
prl_option W
prl_option X
prl_option Y
prl_option Z
;-------------------------------------------------
.name: ;get file name...
IFD prl_file
subq.l #1,a0
jsr prl_file(pc)
tst.l d0 ;return value...
bpl .options
bra .errline
ELSE
bra.s .errline
ENDC
;--------------------------------------
.goodline: ;correct line format
clr.b prl_invalid(a4)
.ouout bsr prl_spacekiller
moveq #0,d0
movem.l (a7)+,d1-d7/a1-a6
rts
;--------------------------------------
;.usage: st prl_invalid(a4)
; bra.s .ouout
;--------------------------------------
.unknparameter:
addq.l #4,a7 ;remove return address from stack
.errline: ;error found in parameter line...
st prl_invalid(a4)
moveq #-1,d0
movem.l (a7)+,d1-d7/a1-a6
rts
;------------------------------------------------
* d2: case 0: case independant -: case dependant
* d3: poossible (accepted) end char (normally a SPC)
* d7: max. length of name (max. 65535)
* a0: source
* a1: destination
*
prl_nametakerxx:
moveq #0,d2 ;lower case
moveq #" ",d3
prl_nametaker: ;d7: max number of chars to take
bsr prl_spacekiller ;d3: additional allowed endchar
moveq #0,d0
moveq #0,d5
move.l d7,d6
subq.l #1,d6
cmp.b #$22,(a0)
beq.s .strtname
cmp.b #"'",(a0)
bne.s .takesource
.strtname:
move.b (a0)+,d5
.takesource:
move.b (a0)+,d0
beq.s .ender2
tst.b d2
beq.s .lower
cmp.b #"a",d0 ;convert to upper case
blt.s .lower
cmp.b #"z",d0
bhi.s .lower
and.b #$df,d0
.lower: cmp.b d0,d5
bne.s .setin
cmp.b (a0)+,d5
bne.s .ender2
.setin: cmp.b #" ",d0
bne.s .inloop
tst.b d5
beq.s .ender2
.inloop:
move.b d0,(a1)+
dbra d7,.takesource
bra .badline
.ender2:
sub.w d7,d6
bmi .badline
clr.b (a1) ;clr after last char
move.b -(a0),d0
beq.s .good
cmp.b d3,d0 ;only useful for '.nametaker' entries
beq.s .good
cmp.b #" ",d0
bne .badline
.good: moveq #0,d0
rts
.badline:
moveq #-1,d0
rts
;------------------------------------------------
prl_spacekiller:
move.b (a0)+,d0
cmp.b #" ",d0
beq.s prl_spacekiller
cmp.b #$9,d0
beq.s prl_spacekiller
subq.l #1,a0
rts
;----------------------------------------------------------
*
* Usage routine...
*
prl_usage:
clr.b prl_invalid(a4)
moveq #-1,d0
movem.l (a7)+,d1-d7/a1-a6
rts
;----------------------------------------------------------
;prl_cmdlen: dc.l 0 ;command line length
;prl_cmdline: dc.l 0 ;command line
prl_invalid: dc.b 0 ;0: ok -: invalid parameter line
even
;--------------------------------------------------------------------
;------------------
base prl_oldbase
;------------------
opt rcl
;------------------
endif
end